﻿//using System;
//using System.Collections.Generic;
//using System.Reflection;
//using System.Runtime.InteropServices;
//using System.Text;
//#if ENABLE_MONO
//partial class MonoBridge
//{

//    public static object ConvertP(Type targetType, object obj)
//    {
//        if (targetType.IsEnum)
//        {
//            var t = Enum.ToObject(targetType, obj);
//            return t;
//        }
//        else if (targetType == typeof(string))
//        {
//            var p = (IntPtr)obj;
//            if (p != IntPtr.Zero)
//                return GCHandle.FromIntPtr(p).Target;
//            else
//                return null;
//        }
//        else if (targetType.IsPrimitive)
//        {
//            return obj;
//        }
//        else
//        {
//            var p = (IntPtr)obj;
//            if (p != IntPtr.Zero)
//                return GCHandle.FromIntPtr(p).Target;
//            else
//                return null;
//        }
//    }
//    public static RT ConvertReturn<RT>(Type srctype, object obj)
//    {
//        if (srctype.IsEnum)
//        {
//            return (RT)obj;
//        }
//        else if (srctype == typeof(string))
//        {
//            if (obj == null)
//                return (RT)(object)IntPtr.Zero;
//            return (RT)(object)GCHandle.ToIntPtr(GCHandle.Alloc(obj));
//        }
//        else if (srctype.IsPrimitive)
//        {
//            return (RT)obj;
//        }
//        else
//        {
//            if (obj == null)
//                return (RT)(object)IntPtr.Zero;
//            return (RT)(object)GCHandle.ToIntPtr(GCHandle.Alloc(obj));
//        }
//    }
//    static MethodInfo _FindMethod(Type type, string methodName)
//    {
//        var infos = methodName.Split(new char[] { '(', ',', ')' }, StringSplitOptions.RemoveEmptyEntries);
//        var name = infos[0];
//        var pcount = infos.Length - 1;
//        Type[] ts = new Type[pcount];
//        for (var i = 0; i < ts.Length; i++)
//        {
//            ts[i] = _FindType(infos[i + 1]);
//        }

//        var method = type.GetMethod(name, ts);
//        if (method == null)
//        {
//            UnityEngine.Debug.LogWarning("_FindMethod Error." + type + " " + methodName);
//        }
//        return method;
//    }
//    static ConstructorInfo _FindCTOR(Type type, string methodName)
//    {
//        var infos = methodName.Split(new char[] { '(', ',', ')' }, StringSplitOptions.RemoveEmptyEntries);
//        var name = infos[0];
//        var pcount = infos.Length - 1;
//        Type[] ts = new Type[pcount];
//        for (var i = 0; i < ts.Length; i++)
//        {
//            ts[i] = _FindType(infos[i + 1]);
//            if (ts[i] == null)
//            {
//                UnityEngine.Debug.LogError("_FindMethod Error." + type + " " + methodName + " " + infos[i + 1]);
//                return null;
//            }
//        }

//        var method = type.GetConstructor(ts);
//        if (method == null)
//        {
//            UnityEngine.Debug.LogError("_FindMethod Error." + type + " " + methodName);
//        }
//        return method;
//    }
//    static Dictionary<string, IDeleProxy> allfuncs = new Dictionary<string, IDeleProxy>();
//    private static IntPtr _FindMethodDeleUnsafe(Type __type, string __name)
//    {
//        var _fullname = __type.FullName + "::" + __name;
//        if (allfuncs.ContainsKey(_fullname))
//            return allfuncs[_fullname].delePtr;
//        UnityEngine.Debug.Log(__type);
//        var method = _FindMethod(__type, __name);
//        UnityEngine.Debug.Log("method1=" + method);

//        if (method != null)
//        {
//            IDeleProxy deleProxy = null;
//            var ps = method.GetParameters();
//            if (method.ReturnType == typeof(void))
//            {
//                if (ps.Length == 0)
//                {
//                    deleProxy = new DelegateProxy_Action(method);
//                }
//                else
//                {
//                    Type[] ts = new Type[ps.Length];
//                    for (var i = 0; i < ps.Length; i++)
//                    {
//                        var t = ps[i].ParameterType;
//                        if (t.IsEnum)
//                        {
//                            ts[i] = t.UnderlyingSystemType;
//                        }
//                        else if (t.IsPrimitive)
//                        {
//                            ts[i] = t;
//                        }
//                        else if (t == typeof(string))
//                        {
//                            ts[i] = typeof(IntPtr);
//                        }
//                        else
//                        {
//                            ts[i] = typeof(IntPtr);
//                        }
//                    }
//                    var type = Type.GetType("DelegateProxy_Action`" + ts.Length);
//                    var treal = type.MakeGenericType(ts);
//                    var trealctor = treal.GetConstructor(new Type[] { typeof(MethodInfo) });
//                    deleProxy = trealctor.Invoke(new object[] { method }) as IDeleProxy;
//                }
//            }
//            else
//            {

//                Type[] ts = new Type[ps.Length + 1];
//                if (method.ReturnType.IsEnum)
//                {
//                    ts[ts.Length - 1] = method.ReturnType.UnderlyingSystemType;
//                }
//                else if (method.ReturnType.IsPrimitive)
//                {
//                    ts[ts.Length - 1] = method.ReturnType;
//                }
//                else if (method.ReturnType == typeof(string))
//                {
//                    ts[ts.Length - 1] = typeof(IntPtr);
//                }
//                else
//                {
//                    ts[ts.Length - 1] = typeof(IntPtr);
//                }
//                for (var i = 0; i < ps.Length; i++)
//                {
//                    var t = ps[i].ParameterType;
//                    if (t.IsEnum)
//                    {
//                        ts[i] = t.UnderlyingSystemType;
//                    }
//                    else if (t.IsPrimitive)
//                    {
//                        ts[i] = t;
//                    }
//                    else if (t == typeof(string))
//                    {
//                        ts[i] = typeof(IntPtr);
//                    }
//                    else
//                    {
//                        ts[i] = typeof(IntPtr);
//                    }
//                }
//                var ass = typeof(MonoBridge).Assembly;
//                var type = ass.GetType("DelegateProxy_Func`" + ts.Length);
//                var treal = type.MakeGenericType(ts);
//                var trealctor = treal.GetConstructor(new Type[] { typeof(MethodInfo) });
//                deleProxy = trealctor.Invoke(new object[] { method }) as IDeleProxy;

//            }
//            allfuncs[_fullname] = deleProxy;
//        }
//        else
//        {
//            UnityEngine.Debug.LogError("Not found." + _fullname);
//        }

//        if (allfuncs.ContainsKey(_fullname))
//            return allfuncs[_fullname].delePtr;
//        else
//            return IntPtr.Zero;
//    }
//    private static IntPtr _FindCTORDeleUnsafe(Type __type, string __name)
//    {
//        var _fullname = __type.FullName + "::" + __name;
//        if (allfuncs.ContainsKey(_fullname))
//            return allfuncs[_fullname].delePtr;
//        UnityEngine.Debug.Log(__type);
//        var method = _FindCTOR(__type, __name);
//        UnityEngine.Debug.Log("ctor=" + method);

//        if (method != null)
//        {
//            IDeleProxy deleProxy = null;
//            var ps = method.GetParameters();
//            {
//                Type[] ts = new Type[ps.Length + 1];
//                ts[ts.Length - 1] = typeof(IntPtr);
//                for (var i = 0; i < ps.Length; i++)
//                {
//                    var t = ps[i].ParameterType;
//                    if (t.IsEnum)
//                    {
//                        ts[i] = t.UnderlyingSystemType;
//                    }
//                    else if (t.IsPrimitive)
//                    {
//                        ts[i] = t;
//                    }
//                    else if (t == typeof(string))
//                    {
//                        ts[i] = typeof(IntPtr);
//                    }
//                    else
//                    {
//                        ts[i] = typeof(IntPtr);
//                    }
//                }
//                var ass = typeof(MonoBridge).Assembly;
//                var typename = "DelegateProxy_CtorFunc`" + ts.Length;
//                var type = ass.GetType(typename);
//                if (type == null)
//                {
//                    UnityEngine.Debug.LogError("can't found type:" + typename);
//                }
//                var treal = type.MakeGenericType(ts);
//                var trealctor = treal.GetConstructor(new Type[] { typeof(ConstructorInfo) });
//                deleProxy = trealctor.Invoke(new object[] { method }) as IDeleProxy;

//            }
//            allfuncs[__name] = deleProxy;
//        }
//        else
//        {
//            UnityEngine.Debug.LogError("Not found." + _fullname);
//        }

//        if (allfuncs.ContainsKey(__name))
//            return allfuncs[__name].delePtr;
//        else
//            return IntPtr.Zero;
//    }

//}
//#endif